/** Clase para mostrar la informacion del sistema **/

package clientegestionred;

import common.Set;
import common.Consulta;
import common.Cons;
import common.SesionSNMP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.Variable;

public class InfoSistema implements Cons {

    private Consulta consulta; //para hacer consultas

    private Set setObject; //para hacer operaciones SET

    private SesionSNMP ReadSesion; //sesion de lectura

    private SesionSNMP WriteSesion; //sesion de escritura

    private BufferedReader bReader = new BufferedReader(new 
            InputStreamReader(System.in)); //lectura por teclado
     
    
    /* Constructor */
    public InfoSistema(SesionSNMP sesion1, SesionSNMP sesion2) {
	ReadSesion = sesion1;
        WriteSesion = sesion2;
        consulta = new Consulta(ReadSesion);
    }

    /* Obtener la informacion del sistema y ofrecer la posibilidad de
     configurar algunos parametros */
    public int getAndModify(){

        String linea = "";
        OID[] oids = new OID[]{SYS_NAME, SYS_DESCR, SYS_CONTACT, SYS_LOCATION,
                        SYS_UPTIME, IP_ROUTE_NEXT_HOP};
        try{
            Variable []respuestas = consulta.get(oids);
            printInfo(respuestas);
        }catch(java.io.IOException ioex){
            System.err.println("Error mientras se hacia GET.");
            return -1;
        }

        System.out.print("\n\t¿Quiere modificar algún parametro? Escriba"
                + " SI o NO: ");
        while(true){
            try{
                linea = bReader.readLine();
                // SI Modificar
                if (linea.equalsIgnoreCase("si")){
                    System.out.println("\tElija el parametro de entre las "
                            + "posibles opciones: ");
                    System.out.flush();
                    modify();
                    return 0;
                }
                // NO Modificar
                if (linea.equalsIgnoreCase("no")){
                    return 0; }

                System.out.print("Lo siento, su eleccion es incorrecta. "
                        + "Por favor, escriba solamente SI o NO: ");

            }catch(java.io.IOException ioex){
                System.err.println("Error en la lectura por teclado. El "
                        + "programa va a finalizar.");
                System.exit(-1);
            }
        } //while
        
    } //getAndModify



    /* Imprimir la informacion */
    private void printInfo(Variable []respuestas){
        System.out.println("\nInformacion del equipo");
        System.out.println("\tNombre: " + respuestas[0].toString());
        System.out.println("\tDescripcion del equipo: " + respuestas[1].
                toString());
        System.out.println("\tInformacion de contacto: " + respuestas[2].
                toString());
        System.out.println("\tLocalizacion: " + respuestas[3].toString());
        System.out.println("\tTiempo desde el arranque: " + respuestas[4].
                toString());
        System.out.println("\tPuerta de enlace: " + respuestas[5].toString());
        System.out.flush();
    }

    /* Elegir lo que se desea modifar */
    private void modify(){
        int elec = 0;
        do{
            System.out.println("\t 1.- Nombre del equipo");
            System.out.println("\t 2.- Informacion de contacto");
            System.out.println("\t 3.- Localizacion");
            System.out.println("\t 4.- Puerta de enlace (No disponible)");
            System.out.println("\t 0.- Salir");
            System.out.print("\tEleccion: ");
            System.out.flush();

            String index = null;
            try {
                index = bReader.readLine();
                try{
                    elec = Integer.parseInt(index.trim());}
                catch(java.lang.NumberFormatException e){
                    System.err.println("Valor no valido.");
                    System.err.flush();
                    break;
                }
                if ( elec <= 0 ){ //numero no valido
                    break;
                }else { //hacer la modificacion
                    setObject = new Set(WriteSesion);
                    setParameter(Integer.parseInt(index.trim())); }
            } catch (IOException ex) {
                System.err.println("Error en la lectura por teclado.");
                break;
            }
            System.out.println("\t¿Alguna modificacion mas?");
        }while(true);
    } //modify


    /* Dar un nuevo valor a algun parametro */
    private int setParameter(int n) throws IOException{

        int respCode = -1;

        if (n>=4){
            System.out.println("\tOpcion no disponible.");
            return 0;
        }
        System.out.print("\tEscriba el nuevo valor: ");
        System.out.flush();
        OctetString []valor = new OctetString[]{new OctetString(bReader.
                readLine())};
        
        switch(n){
            case 1: // nombre
                respCode = setObject.set(new OID[]{SYS_NAME}, valor);
                break;

            case 2: // contacto
                respCode = setObject.set(new OID[]{SYS_CONTACT}, valor);
                break;

            case 3: // localizacion
                respCode = setObject.set(new OID[]{SYS_LOCATION}, valor);
                break;

            case 4: // puerta de enlace (no disponible todavia)
                break;

            default:
                break;
        }
        // Comprobar si ha habido exito en la modificacion
        if(respCode == 0)
            System.out.println("\t\tParametro modificado exitosamente.");
        else System.out.println("\t\tError. El valor no ha sido modificado.");

        return 0;
        
    } //setParameter

} //class
